import os
import shutil
from pathlib import Path
import datetime
import zipfile

def create_bt_package():
    """为宝塔部署创建项目包"""
    # 获取项目根目录
    root_dir = Path(__file__).parent.parent
    
    # 创建打包目录
    dist_dir = root_dir / 'dist'
    dist_dir.mkdir(exist_ok=True)
    
    # 生成版本号（使用时间戳）
    version = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
    
    # 打包文件名
    package_name = f'h5_site_bt_v{version}.zip'
    package_path = dist_dir / package_name
    
    # 需要包含的文件和目录
    includes = [
        'app',
        'scripts',
        'requirements.txt',
        'run.py',
        'uwsgi.ini'  # 添加 uwsgi 配置文件
    ]
    
    # 需要排除的模式
    excludes = [
        '__pycache__',
        '*.pyc',
        '*.pyo',
        '*.pyd',
        '.DS_Store',
        '*.db',
        'instance/*',
        'logs/*',
        'temp/*'
    ]
    
    # 创建 uwsgi 配置文件
    uwsgi_config = f"""[uwsgi]
socket = 127.0.0.1:5000
chdir = {root_dir}
wsgi-file = run.py
callable = app
processes = 4
threads = 2
master = true
vacuum = true
die-on-term = true
"""
    
    with open(root_dir / 'uwsgi.ini', 'w', encoding='utf-8') as f:
        f.write(uwsgi_config)
    
    try:
        with zipfile.ZipFile(package_path, 'w', zipfile.ZIP_DEFLATED) as zf:
            for include in includes:
                path = root_dir / include
                if path.is_file():
                    # 如果是文件直接添加
                    zf.write(path, include)
                elif path.is_dir():
                    # 如果是目录，遍历添加
                    for file_path in path.rglob('*'):
                        # 检查是否应该排除
                        should_exclude = any(
                            file_path.match(pattern) for pattern in excludes
                        )
                        if not should_exclude and file_path.is_file():
                            zf.write(
                                file_path, 
                                str(file_path.relative_to(root_dir))
                            )
        
        print(f"打包完成: {package_path}")
        
        # 生成部署说明
        deploy_instructions = f"""宝塔部署说明：

1. 上传文件：
   - 将 {package_name} 上传到服务器
   - 解压到网站根目录：unzip {package_name}

2. 安装依赖：
   cd 网站根目录
   pip3 install -r requirements.txt

3. 配置环境变量：
   在宝塔面板 Python 项目管理中添加以下环境变量：
   FLASK_APP=run.py
   FLASK_ENV=production
   
   添加七牛云配置：
   QINIU_ACCESS_KEY=your_access_key
   QINIU_SECRET_KEY=your_secret_key
   QINIU_BUCKET_NAME=your_bucket_name
   QINIU_DOMAIN=your_domain

4. 配置 uwsgi：
   - 使用提供的 uwsgi.ini
   - 在宝塔 Python 项目管理中设置启动方式为 uwsgi
   - 设置项目路径和配置文件路径

5. 启动项目：
   - 在宝塔面板中启动项目
   - 检查日志确保无错误

6. 配置反向代理：
   - 添加反向代理到 5000 端口
   - 配置 SSL 证书（如需要）

注意事项：
- 确保目录权限正确
- 检查防火墙设置
- 建议启用 SSL
"""
        
        # 保存部署说明
        deploy_instructions_path = dist_dir / f'deploy_instructions_{version}.txt'
        with open(deploy_instructions_path, 'w', encoding='utf-8') as f:
            f.write(deploy_instructions)
            
        print(f"部署说明已生成: {deploy_instructions_path}")
        
    except Exception as e:
        print(f"打包过程中出错: {str(e)}")
        if os.path.exists(package_path):
            os.remove(package_path)

if __name__ == '__main__':
    create_bt_package() 